/* -----------------------------------------------------------------------------
ep֐E}CNXbhW@e쐬ҁ@@uAttributeAdd_Shotsv

@ɉL̓ނō\B
@@@Objn̊{IȒeiу[U[j쐬֐
@@ALō쐬eɓȓiFattributejǉ}CNXbh

@͉L̒ʂBԍ͏LɑΉBu`v̕ɂꂼ̒PꂪB
@@@Create`Obj@ie{ƂCreateShotȂǂƓB
@@AAA_`@@@@iAttributeAdd̗B`͒̕e{ƂCȂǂƓB

@AɊւĂ͓ƌĂėpIɎĝɁB̂ӂȏgݍ킹Ƃ̓Rsyō̂yBƍlB
@Ȃ݂ɃAXL[A[g͖֌WB
----------------------------------------------------------------------------- */


// @A聫-------------------------------------------------------------

// ֐FCreateShotObjiԂlF쐬IuWFNgeԍj
// ʏe̍쐬
// x=쐬ʒu(X)@y=쐬ʒu(Y)@spd=Xs[h
// ang=px@gp=摜@dly=˂܂ł̃A
// ԂCS01Ɠ悤ȃiH

function CreateShotObj(let x,let y,let spd,let ang,let gp,let dly) {
	let id=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(id,x,y);
	Obj_SetSpeed(id,spd);
	Obj_SetAngle(id,ang);
	ObjShot_SetGraphic(id,gp);
	ObjShot_SetDelay(id,dly);
	return id;
}


// ֐FCreateLaserObjAiԂlF쐬IuWFNgԍj
// ݒu^[U[̍쐬
// x=쐬ʒu(X)@y=쐬ʒu(Y)@ang=px@gp=摜
// len=[U[̒@wid=[U[̕@dly=˂܂ł̃A@source=̗L

function CreateLaserObjA(let x,let y,let ang,let len,let wid,let gp,let dly,let source) {
	let id=Obj_Create(OBJ_LASER);
	Obj_SetPosition(id,x,y);
	Obj_SetAngle(id,ang);
	ObjLaser_SetLength(id,len);
	ObjLaser_SetWidth(id,wid);
	ObjShot_SetGraphic(id,gp);
	ObjShot_SetDelay(id,dly);
	ObjLaser_SetSource(id,source);
	return id;
}


// ֐FCreateLaserObjCiԂlF쐬IuWFNgԍj
// ȃ[U[̍쐬
// x=쐬ʒu(X)@y=쐬ʒu(Y)@spd=Xs[h@ang=px
// len=ct[@wid=@gp=摜@dly=˂܂ł̃A

function CreateLaserObjC(let x,let y,let spd,let ang,let len,let wid,let gp,let dly) {
	let id=Obj_Create(OBJ_SINUATE_LASER);
	Obj_SetPosition(id,x,y);
	Obj_SetSpeed(id,spd);
	Obj_SetAngle(id,ang);
	ObjSinuateLaser_SetLength(id,len);
	ObjSinuateLaser_SetWidth(id,wid);
	ObjShot_SetGraphic(id,gp);
	ObjShot_SetDelay(id,dly);
	return id;
}

// @A܂Ł-------------------------------------------------------------

// AA聫-------------------------------------------------------------

// }CNXbhFAA_Homing
// ǔǉ
// Fshot01,02,A
// id=Obje쐬̕Ԃl@seido=t[Pʂ̐px@time=p

task AA_Homing(let id,let seido,let time) {
	while(Obj_BeDeleted(id)==false && time>0) {
		yield;
		time--;
		let a=atan2(GetPlayerY()-Obj_GetY(id),GetPlayerX()-Obj_GetX(id));
		let b=Obj_GetAngle(id);
		let c=0;
		if(a-b==0) {} else {
			if(cos((a-b)+1)>cos((a-b)-1)) {c=-1;} else {c=1;}
			if(absolute(a-b)%360>seido) {
				Obj_SetAngle(id,b+seido*c);
			} else {
				Obj_SetAngle(id,a);
			}
		}
	}
}


// }CNXbhFAA_Reflect
// ˑǉ
// Fshot01,02,A
// id=Obje쐬̕Ԃl@count=ˉ񐔁@fright=@fup=@fdown=@fleft=

task AA_Reflect(let id,let count,let fright,let fup,let fdown,let fleft) {
	while(count>0 && Obj_BeDeleted(id)==false) {
		let angle=Obj_GetAngle(id);
		let tmX=Obj_GetX(id);
		let tmY=Obj_GetY(id);
		if(fright==true && tmX>=GetClipMaxX()) {
			count--;
			Obj_SetAngle(id,(angle-180)*-1);
			Obj_SetX(id,GetClipMaxX()+GetClipMaxX()-tmX);
		}
		if(fleft==true && tmX<=GetClipMinX()) {
			count--;
			Obj_SetAngle(id,(angle-180)*-1);
			Obj_SetX(id,GetClipMinX()+GetClipMinX()-tmX);
		}
		if(fdown==true && tmY>=GetClipMaxY()) {
			count--;
			Obj_SetAngle(id,90-(angle-270));
			Obj_SetY(id,GetClipMaxY()+GetClipMaxY()-tmY);
		}
		if(fup==true && tmY<=GetClipMinY()) {
			count--;
			Obj_SetAngle(id,90-(angle-270));
			Obj_SetY(id,GetClipMinY()+GetClipMinY()-tmY);
		}
		yield;
	}
}


// }CNXbhFAA_Homing
// ԏőǉ
// FSĂ̒eA[U[
// id=Obje쐬̕Ԃl@time=ł܂ł̎ԁ@type=or

task AA_TimeDelete(let id,let time,let type) {
	loop(time) {yield;}
	if(Obj_BeDeleted(id)==false) {
		if(type==false) {Obj_Delete(id);}
		if(type==true) {ObjShot_FadeDelete(id);}
	}
}


// ԌiׂȂjǉ
// FȂȂ[U[̂
// id=Obje쐬̕Ԃl@waittime=Jn҂ԁ@closetime=܂ł̎
task AA_LaserCloseAB(let id,let waittime,let closetime) {
	wait(waittime);
	let wid=ObjLaser_GetWidth(id);
	descent(cnt in 0..closetime) {
		if(Obj_BeDeleted(id)==true) {break;}
		ObjLaser_SetWidth(id,wid*cnt/closetime);
		yield;
	}
	Obj_Delete(id);
}


// ԌiׂȂjǉ
// FȂ郌[U[̂
// id=Obje쐬̕Ԃl@waittime=Jn҂ԁ@closetime=܂ł̎
task AA_LaserCloseC(let id,let wid,let waittime,let closetime) {
	wait(waittime);
	descent(cnt in 0..closetime) {
		if(Obj_BeDeleted(id)==true) {break;}
		ObjSinuateLaser_SetWidth(id,wid*cnt/closetime);
		yield;
	}
	Obj_Delete(id);
}


// ړǉ@̂P
// FSĂ̒eA[U[AGtFNgIuWFNg
// id=Obje쐬̕Ԃl@ang=ړ@spd=ړXs[h
task AA_Move01(let id,let spd,let ang) {
	while(Obj_BeDeleted(id)==false) {
		let x=Obj_GetX(id)+cos(ang)*spd;
		let y=Obj_GetY(id)+sin(ang)*spd;
		Obj_SetPosition(id,x,y);
		yield;
	}
}


// ړǉ@̂Pixtj
// FSĂ̒eA[U[AGtFNgIuWFNg
// id=Obje쐬̕Ԃl@ang=ړ@spd=ړXs[h
task AA_Move01Accsel(let id,let spd,let ang,let spdpl,let time) {
	task accsel() {
		loop(time) {
			spd+=spdpl;
			yield;
		}
	}
	accsel();
	while(Obj_BeDeleted(id)==false) {
		let x=Obj_GetX(id)+cos(ang)*spd;
		let y=Obj_GetY(id)+sin(ang)*spd;
		Obj_SetPosition(id,x,y);
		yield;
	}
}

// ړǉ@̂Q
// FSĂ̒eA[U[AGtFNgIuWFNg
// id=Obje쐬̕Ԃl@ang=ړ@spd=ړXs[h
// @s`ɂ΂炭܂
// AMove01dȂɂӐ}Ȃ삪N\̂ŒӁB
task AA_Move02(let id,let spd,let ang) {
	let count=60;
	task counter() {
		while(Obj_BeDeleted(id)==false) {yield;}
		loop(60) {
			count--;
			yield;
		}
	}
	counter();
	while(count>0) {
		let x=Obj_GetX(id)+cos(ang)*spd;
		let y=Obj_GetY(id)+sin(ang)*spd;
		Obj_SetPosition(id,x,y);
		yield;
	}
}


// exGtFNĝւ
// Fshot01,02,A
// id=Obje쐬̕Ԃl@time=p

task AA_SetDelay01(let id,let time) {
	let maxTime=time;
	ObjShot_SetDelay(id,0);
	Obj_SetCollisionToPlayer(id,false);
	Obj_SetAlpha(id,0);
	while(time>0) {
		yield;
		if(Obj_BeDeleted(id)==true) {return;}
		Obj_SetAlpha(id,255*(maxTime-time)/maxTime);
		time--;
	}
	Obj_SetAlpha(id,255);
	Obj_SetCollisionToPlayer(id,true);
}

/* -----------------------------------------------------------------------------
ep֐E}CNXbhW@̑

@eɕWœڂĂȂǊƗǂg֐E}CNXbhWB

----------------------------------------------------------------------------- */

// ֐Fwait
// wyieldB
function wait(let a) {
	loop(a) {yield;}
	return;
}


// ֐Flimit
// aminȏmaxȉɂȂ悤ɒB
function limit(let a,let min,let max) {
	if(a<min) {a=min;}
	if(a>max) {a=max;}
	return a;
}


// ֐FdisplayIn
// w肵XYWAʓ(tm64͂邱ƂŒʏAeLȔ͈͓)ǂ`FbNB
function displayIn(let x,let y,let tm) {
	let a=false;
	if( x>=(GetClipMinX()-tm) && x<=(GetClipMaxX()+tm) && y>=(GetClipMinY()-tm) && y<=(GetClipMaxY()+tm)) {a=true;}
	return a;
}


// ֐FdisplayDiv
// ʂxAcyꍇ̂P}X̃TCY擾B
function displayDiv(let x,let y) {
	let a;
	x=(GetClipMaxX()-GetClipMinX())/x;
	y=(GetClipMaxY()-GetClipMinY())/y;
	a=[x,y];
	return a;
}


// ֐Fp1m0
// ^ꂽ͏_ȉⓚpŐ؂̂ĂŐΒlɂB
// ̐Ȃu1vAȂu-1vԂB
function p1m0(let a) {
	a=absolute(trunc(a))%2*2-1;
	return a;
}


// ֐FrandList
// O^ꂽ܂ł_ɕёւzԂ֐B
// oȂ_gƂɁB
function randList(let a) {
	if(a<=0) {return;}// Oȉ̏ꍇ͉ɏI`BG[ô߂(ry
	// ËꗗĂ݂
	let tm=[];
	let tm2=0;
	let list=[];
	ascent(let cnt in 0..a) {
		tm=tm~[cnt];
		list=list~[0];
	}
	ascent(let cnt in 0..a) {
		tm2=rand_int(0,a-(cnt+1));
		list[cnt]=tm[tm2];
		tm[tm2]=tm[a-cnt-1];
	}
	return list;
}


// ֐Fbeziers
// ƎO̓_w肵ăxWGȐ`AzŕԂB
// Ɏn_Aԓ_AI_
function beziers(let nam,let a,let sx,let sy,let px,let py,let ex,let ey) {
	let tm1x=sx+(px-sx)*a/nam;
	let tm2x=px+(ex-px)*a/nam;
	let tm1y=sy+(py-sy)*a/nam;
	let tm2y=py+(ey-py)*a/nam;
	let tm=[tm1x+(tm2x-tm1x)*a/nam,tm1y+(tm2y-tm1y)*a/nam];
	return tm;
}


//}CNXbhFcollision
//w肵t[AGʒuɓ蔻𔭐B
//timeɐݒ肷̂̓{XniϋvejŁASɏ܂œ蔻cꍇȂǂɎw肷B
//timeNULLw肷ƖiG|܂ŁjɂȂBi͂ŁB
task collision(let a,let b,let time) {
	loop(time) {
		SetCollisionA(GetX(),GetY(),a);
		SetCollisionB(GetX(),GetY(),b);
		yield;
	}
}

//}CNXbhFcollisionBombResist
//w肵t[AGʒuɓ蔻𔭐B
//LƈႤ̂́A{gpɓ蔻肪ȂȂ邱Ƃ̂݁B
task collisionBombResist(let a,let b,let time) {
	loop(time) {
		while(OnBomb()==true) {yield;}
		SetCollisionA(GetX(),GetY(),a);
		SetCollisionB(GetX(),GetY(),b);
		yield;
	}
}


//}CNXbhFmove01
//ʒuɈړ(sx,sy)莞ԑҋ@(time1)BĈ莞Ԓu(time2)Ɏw(wx,wy)܂ł̃_Ŏ@ɈړB
//wx͌ݒn_̈ړAwy͏ʒu(sy)̏㉺B
//ʒ[̏F肬܂ňړB
task move01(let sx,let sy,let time1,let time2,let wx,let wy) {
	let tm;
	let min=GetClipMinX()+32;
	let max=GetClipMaxX()-32;
	SetMovePosition03(sx,sy,10,8); //ʒuւ̈ړ
	loop(time1) {yield;}
	while(wx>0) {
		tm=GetX()+((GetPlayerX()>GetX())-(GetPlayerX()<GetX()))*rand(0,wx);
		if(tm<min) {tm=min;}
		if(tm>max) {tm=max;}
		SetMovePosition03(tm,sy+rand(-wy,wy),10,2);
		loop(time2) {yield;}
	}
}

//}CNXbhFmove02
//ʒuɈړ(sx,sy)莞ԑҋ@(time1)BĈ莞Ԓu(time2)Ɏw(wx,wy)܂ł̃_Ŏ@ɈړB
//wx͌ݒn_̈ړAwy͏ʒu(sy)̏㉺B
//ʒ[̏Fʒ[ɏoƂ͗\ƔΑɈړB
task move02(let sx,let sy,let time1,let time2,let wx,let wy) {
	let tm;
	let min=GetClipMinX()+32;
	let max=GetClipMaxX()-32;
	SetMovePosition03(sx,sy,10,8); //ʒuւ̈ړ
	loop(time1) {yield;}
	while(wx>0) {
		let rnd=rand(0,wx);
		let lr=((GetPlayerX()>GetX())-(GetPlayerX()<GetX()));
		tm=GetX()+lr*rnd;
		if( (tm<min) + (tm>max) ) {tm=GetX()-lr*rnd;}
		SetMovePosition03(tm,sy+rand(-wy,wy),10,2);
		loop(time2) {yield;}
	}
}

